package src.G_E_AnnotationAndReflection;

import java.lang.annotation.*;
import java.util.ArrayList;
import java.util.List;

// 注解
public class G01_AnnotationTest extends Object{

    public static void main(String[] args) {
        G01_AnnotationTest at1 = new G01_AnnotationTest();
        at1.test1();
    }

    // @Override 重写的注解（内置注解）
    @Override
    public String toString() {
        return super.toString();
    }

    // @Deprecated 不推荐程序员使用，但是可以使用，或者存在更好的方式（内置注解）
    @Deprecated
    public void test1() {
        System.out.println("Deprecated");
    }

    // @SuppressWarnings("all") 镇压警告，注释一下注解看效果（内置注解）
    @SuppressWarnings("all")
    public void test2() {
        List list = new ArrayList();
    }
}

// 元注解
@Target(value = {ElementType.METHOD, ElementType.TYPE}) // 描述注解能够作用的范围（这里是方法和类，写在其他地方就会报错）
@Retention(value = RetentionPolicy.RUNTIME) // 表示我们的注解在什么地方还有效（这里定义了运行时有效，表示三个阶段都生效）【SOURCE(编写阶段) < CLASS(编译阶段) < RUNTIME(运行阶段)】
@Documented // 表示该注解被抽取到API帮助文档中
@Inherited // 表示子类可以继承父类中的该注解
// 自定义一个注解（格式：@interface + 注解名）
@interface MyAnnotation1{
    // 注解的参数格式：参数类型+参数名字()，ps：default 可以设置默认值
    String name() default "";
    int age() default 1;
    int id() default -1; // 如果默认值为-1，代表不存在
    String[] schools();
}

class G01_AnnotationTest2{

    @MyAnnotation1(name = "乐乐", schools = {"lele", "mengmeng"}) // 如果没有设置默认值就必须赋值
    public void test3(){}

    @MyAnnotation2(1)
    public void test4(){}
}

// 单参数自定义注解
@interface MyAnnotation2{
    // 如果注解只有一个值，那么格式：参数类型+value()，ps：什么可以直接写值了可以省略value=
    int value();
}